package com.itany.nmms.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itany.nmms.constant.DictConstant;
import com.itany.nmms.constant.StatusConstant;
import com.itany.nmms.dao.ProductTypeMapper;
import com.itany.nmms.entity.ProductType;
import com.itany.nmms.entity.ProductTypeExample;
import com.itany.nmms.exception.ProductTypeExistException;
import com.itany.nmms.exception.ProductTypeNotExistException;
import com.itany.nmms.exception.RequestParameterErrorException;
import com.itany.nmms.service.ProductTypeService;
import com.itany.nmms.util.ParameterUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author 石小俊
 * @date 2024年04月19日 18:10
 */
@Service
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public class ProductTypeServiceImpl implements ProductTypeService {

    @Autowired
    private ProductTypeMapper typeMapper;

    @Override
    public void addType(String name) throws RequestParameterErrorException, ProductTypeExistException {
        // 非空校验
        if (ParameterUtil.isNull(name)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 商品类型的名称不能重复,查重
        // 根据当前传递的名称去数据库中进行查询
        // 如果查询到数据了,则说明名称已经重复了
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andNameEqualTo(name);
        List<ProductType> types = typeMapper.selectByExample(example);
        if (!types.isEmpty()) {
            throw new ProductTypeExistException("该类型已经存在");
        }

        // 如果类型名称没有重复,则将当前类型插入到数据库中
        ProductType type = new ProductType();
        type.setName(name);
        // 状态默认设置为启用
        type.setStatus(1);
        typeMapper.insertSelective(type);
    }

    @Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
    @Override
    public PageInfo<ProductType> findPage(String pageNo, String pageSize) {
        // 分页操作共分为三步
        // 1.导入依赖
        // 2.在mybatis-config配置中配置插件
        // 3.在Java代码中实现分页
        // 实现分页的代码又分为三步
        // 第一步:设置分页信息
        // 参数一:第几页
        // 参数二:一页显示几条数据
        // 在请求中可以能传递对应的两个参数,也可能不传递
        // 因此,对于不传递的时候我们需要设置一个默认值
        if (ParameterUtil.isNull(pageNo)) {
            pageNo = DictConstant.PRODUCT_TYPE_DEFAULT_PAGE_NO;
        }
        if (ParameterUtil.isNull(pageSize)) {
            pageSize = DictConstant.PRODUCT_TYPE_DEFAULT_PAGE_SIZE;
        }
        PageHelper.startPage(Integer.parseInt(pageNo), Integer.parseInt(pageSize));

        // 第二步:获取业务数据
        List<ProductType> types = typeMapper.selectByExample(new ProductTypeExample());

        // 第三步:封装分页对象
        PageInfo<ProductType> typePage = new PageInfo<>(types);

        return typePage;
    }

    @Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
    @Override
    public List<ProductType> findAll() throws ProductTypeNotExistException {
        List<ProductType> types = typeMapper.selectByExample(new ProductTypeExample());
        if (types.isEmpty()) {
            throw new ProductTypeNotExistException("请先添加商品类型");
        }
        return types;
    }

    @Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
    @Override
    public ProductType findById(String id) throws RequestParameterErrorException {
        if (ParameterUtil.isNull(id)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        ProductType type = typeMapper.selectByPrimaryKey(Integer.parseInt(id));
        return type;
    }

    @Override
    public void modifyName(String id, String name) throws RequestParameterErrorException, ProductTypeExistException {
        if (ParameterUtil.isNull(id) || ParameterUtil.isNull(name)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 类型名称不能重复,但是可以是原来的
        // 即:当类型名称不是原来的且数据库中已经存在了,则抛出异常
        ProductTypeExample example = new ProductTypeExample();
        example.or()
                .andIdNotEqualTo(Integer.parseInt(id))  // 不是原来的
                .andNameEqualTo(name);  // 数据库中存在的
        List<ProductType> types = typeMapper.selectByExample(example);
        if (!types.isEmpty()) {
            throw new ProductTypeExistException("该商品类型已经存在");
        }

        // 修改商品类型
        ProductType type = new ProductType();
        type.setId(Integer.parseInt(id));
        type.setName(name);
        typeMapper.updateByPrimaryKeySelective(type);
    }

    @Override
    public void modifyStatus(String id) throws RequestParameterErrorException {
        if (ParameterUtil.isNull(id)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        ProductType type = typeMapper.selectByPrimaryKey(Integer.parseInt(id));
        if (StatusConstant.PRODUCT_TYPE_STATUS_ENABLED == type.getStatus()) {
            type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_DISABLED);
        } else {
            type.setStatus(StatusConstant.PRODUCT_TYPE_STATUS_ENABLED);
        }
        typeMapper.updateByPrimaryKeySelective(type);
    }
}
